package br.com.divulgaqui.persistence.daoimpl;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import br.com.divulgaqui.entity.PessoaFisica;
import br.com.divulgaqui.persistence.dao.JPAGenericDAO;
import br.com.divulgaqui.persistence.dao.PessoaFisicaDAO;
import br.com.divulgaqui.util.Util;

public class PessoaFisicaDAOImpl extends JPAGenericDAO<PessoaFisica> implements PessoaFisicaDAO {

	public PessoaFisicaDAOImpl(EntityManager entityManager) {
		super(entityManager);
	}

	

	@Override
	public PessoaFisica getByCPF(String cpf) {
		if (cpf == null || cpf.equals("")) {
			throw new IllegalArgumentException("Parametro não pode ser nulo ou vazio");
		}
		PessoaFisica pessoaFisica = null;
		Query query = this.getEntityManager().createQuery("from PessoaFisica pf where pf.cpf = :cpf");
		query.setParameter("cpf", cpf);
		try {
			pessoaFisica = (PessoaFisica) query.getSingleResult();
		} catch (NoResultException e) {// não encontrou nada na pesquisa
			return null;
		}
		return pessoaFisica;
	}
	
	public Set<PessoaFisica> recuperarTodasAsPessoas() {
		Set<PessoaFisica> result = new HashSet<PessoaFisica>();
		Query query = this.getEntityManager().createQuery("from PessoaFisica pf");
		for (Object o : query.getResultList()) {
			if (o instanceof PessoaFisica) {
				PessoaFisica pf = (PessoaFisica)o;
				result.add(pf);
			}
		}	
		return result;
	}

	@Override
	public List<PessoaFisica> listar(PessoaFisica pessoaFisica) {
		List<PessoaFisica> result = new ArrayList<PessoaFisica>();
		StringBuilder q = new StringBuilder();
		q.append("from PessoaFisica pf");
		if (pessoaFisica.getId() != null) {
			q.append(" where pf.id = " + pessoaFisica.getId());
		}
		else {
			q.append(" where 0=0 ");
			if (!Util.isEmpty(pessoaFisica.getNome())) {
				q.append(" and pf.nome like \'%");
				q.append(pessoaFisica.getNome());
				q.append("%\'");
			}
			else if (!Util.isEmpty(pessoaFisica.getEmail())) {
				q.append(" and pf.email like \'");
				q.append(pessoaFisica.getEmail());
				q.append("\' ");
			}
			else if (!Util.isEmpty(pessoaFisica.getCpf())) {
				q.append(" and pf.cpf like \'");
				q.append(pessoaFisica.getCpf());
				q.append("\' ");
			}
			else if (!Util.isEmpty(pessoaFisica.getAtivo())) {
				q.append(" and pf.ativo is ");
				q.append(pessoaFisica.getAtivo().toString());
			}
		}
		
		Query query = this.getEntityManager().createQuery(q.toString());
		
		for (Object o : query.getResultList()) {
			if (o instanceof PessoaFisica) {
				result.add((PessoaFisica)o);
			}
		}
		return result;
	}
}
